package gbench.webapps.crawler.api.model;

import gbench.util.data.DataApp.IRecord;
import gbench.util.data.DataApp.Tuple2;
import gbench.webapps.crawler.api.model.storage.FileSystemStorageService;
import gbench.webapps.crawler.api.model.storage.StorageProperties;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import static gbench.util.data.DataApp.IRecord.REC;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.regex.Pattern;

/**
 * MediaModel
 */
@Component
public class MediaModel extends FileSystemStorageService {

	/**
	 * MediaModel
	 * 
	 * @param properties
	 */
	public MediaModel(final @Value("${gbench.storage.location:D:/sliced/tmp/crawler/upload-dir}") String location) {
		super(new StorageProperties(location));
	}

	/**
	 * 读取数据文件
	 *
	 * @param file 文件地址
	 * @return (mimetype, 内容数组)
	 * @throws IOException
	 */
	public Tuple2<String, byte[]> readFile(final String file) throws IOException {
		final var fis = new FileInputStream(file);
		final var bytes = fis.readAllBytes();
		fis.close();
		final var matcher = Pattern.compile("\\.([^.]+)$").matcher(file);
		final var flag = matcher.find();
		// println(flag);

		if (flag) {
			final var extension = matcher.group(1);
			final var mimetype = mimeTypes.strOpt(extension).orElse(extension);
			return Tuple2.of(mimetype, bytes);
		} else {
			return Tuple2.of("-", bytes);
		} // if
	}

	/**
	 * 读取数据文件
	 *
	 * @param file 文件地址
	 * @return (mimetype, 内容数组)
	 * @throws IOException
	 */
	public Tuple2<String, FileInputStream> readFile2(final String file) throws IOException {
		final var fis = new FileInputStream(file);
		final var matcher = Pattern.compile("\\.([^.]+)$").matcher(file);
		final var flag = matcher.find();

		if (flag) {
			final var extension = matcher.group(1);
			final var mimetype = mimeTypes.strOpt(extension).orElse(extension);
			return Tuple2.of(mimetype, fis);
		} else {
			return Tuple2.of("-", fis);
		} // if
	}

	/**
	 * mimeTypes 数据源
	 */
	final IRecord mimeTypes = REC("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "xltx",
			"application/vnd.openxmlformats-officedocument.spreadsheetml.template", "potx",
			"application/vnd.openxmlformats-officedocument.presentationml.template", "ppsx",
			"application/vnd.openxmlformats-officedocument.presentationml.slideshow", "pptx",
			"application/vnd.openxmlformats-officedocument.presentationml.presentation", "sldx",
			"application/vnd.openxmlformats-officedocument.presentationml.slide", "docx",
			"application/vnd.openxmlformats-officedocument.wordprocessingml.document", "dotx",
			"application/vnd.openxmlformats-officedocument.wordprocessingml.template", "xlam",
			"application/vnd.ms-excel.addin.macroEnabled.12", "xlsb",
			"application/vnd.ms-excel.sheet.binary.macroEnabled.12", "apk", "application/vnd.android.package-archive",
			"hqx", "application/mac-binhex40", "cpt", "application/mac-compactpro", "doc", "application/msword", "ogg",
			"audio/ogg", "pdf", "application/pdf", "rtf", "text/rtf", "mif", "application/vnd.mif", "xls",
			"application/vnd.ms-excel", "ppt", "application/vnd.ms-powerpoint", "odc",
			"application/vnd.oasis.opendocument.chart", "odb", "application/vnd.oasis.opendocument.database", "odf",
			"application/vnd.oasis.opendocument.formula", "odg", "application/vnd.oasis.opendocument.graphics", "otg",
			"application/vnd.oasis.opendocument.graphics-template", "odi", "application/vnd.oasis.opendocument.image",
			"odp", "application/vnd.oasis.opendocument.presentation", "otp",
			"application/vnd.oasis.opendocument.presentation-template", "ods",
			"application/vnd.oasis.opendocument.spreadsheet", "ots",
			"application/vnd.oasis.opendocument.spreadsheet-template", "odt", "application/vnd.oasis.opendocument.text",
			"odm", "application/vnd.oasis.opendocument.text-master", "ott",
			"application/vnd.oasis.opendocument.text-template", "oth", "application/vnd.oasis.opendocument.text-web",
			"sxw", "application/vnd.sun.xml.writer", "stw", "application/vnd.sun.xml.writer.template", "sxc",
			"application/vnd.sun.xml.calc", "stc", "application/vnd.sun.xml.calc.template", "sxd",
			"application/vnd.sun.xml.draw", "std", "application/vnd.sun.xml.draw.template", "sxi",
			"application/vnd.sun.xml.impress", "sti", "application/vnd.sun.xml.impress.template", "sxg",
			"application/vnd.sun.xml.writer.global", "sxm", "application/vnd.sun.xml.math", "sis",
			"application/vnd.symbian.install", "wbxml", "application/vnd.wap.wbxml", "wmlc", "application/vnd.wap.wmlc",
			"wmlsc", "application/vnd.wap.wmlscriptc", "bcpio", "application/x-bcpio", "torrent",
			"application/x-bittorrent", "bz2", "application/x-bzip2", "vcd", "application/x-cdlink", "pgn",
			"application/x-chess-pgn", "cpio", "application/x-cpio", "csh", "application/x-csh", "dvi",
			"application/x-dvi", "spl", "application/x-futuresplash", "gtar", "application/x-gtar", "hdf",
			"application/x-hdf", "jar", "application/java-archive", "jnlp", "application/x-java-jnlp-file", "js",
			"application/javascript", "json", "application/json", "ksp", "application/x-kspread", "chrt",
			"application/x-kchart", "kil", "application/x-killustrator", "latex", "application/x-latex", "rpm",
			"application/x-rpm", "sh", "application/x-sh", "shar", "application/x-shar", "swf",
			"application/x-shockwave-flash", "sit", "application/x-stuffit", "sv4cpio", "application/x-sv4cpio",
			"sv4crc", "application/x-sv4crc", "tar", "application/x-tar", "tcl", "application/x-tcl", "tex",
			"application/x-tex", "man", "application/x-troff-man", "me", "application/x-troff-me", "ms",
			"application/x-troff-ms", "ustar", "application/x-ustar", "src", "application/x-wais-source", "zip",
			"application/zip", "m3u", "audio/x-mpegurl", "ra", "audio/x-pn-realaudio", "wav", "audio/x-wav", "wma",
			"audio/x-ms-wma", "wax", "audio/x-ms-wax", "pdb", "chemical/x-pdb", "xyz", "chemical/x-xyz", "bmp",
			"image/bmp", "gif", "image/gif", "ief", "image/ief", "png", "image/png", "wbmp", "image/vnd.wap.wbmp",
			"ras", "image/x-cmu-raster", "pnm", "image/x-portable-anymap", "pbm", "image/x-portable-bitmap", "pgm",
			"image/x-portable-graymap", "ppm", "image/x-portable-pixmap", "rgb", "image/x-rgb", "xbm",
			"image/x-xbitmap", "xpm", "image/x-xpixmap", "xwd", "image/x-xwindowdump", "css", "text/css", "rtx",
			"text/richtext", "tsv", "text/tab-separated-values", "jad", "text/vnd.sun.j2me.app-descriptor", "wml",
			"text/vnd.wap.wml", "wmls", "text/vnd.wap.wmlscript", "etx", "text/x-setext", "mxu", "video/vnd.mpegurl",
			"flv", "video/x-flv", "wm", "video/x-ms-wm", "wmv", "video/x-ms-wmv", "wmx", "video/x-ms-wmx", "wvx",
			"video/x-ms-wvx", "avi", "video/x-msvideo", "movie", "video/x-sgi-movie", "ice", "x-conference/x-cooltalk",
			"3gp", "video/3gpp", "ai", "application/postscript", "aif", "audio/x-aiff", "aifc", "audio/x-aiff", "aiff",
			"audio/x-aiff", "asc", "text/plain", "atom", "application/atom+xml", "au", "audio/basic", "bin",
			"application/octet-stream", "cdf", "application/x-netcdf", "cgm", "image/cgm", "class",
			"application/octet-stream", "dcr", "application/x-director", "dif", "video/x-dv", "dir",
			"application/x-director", "djv", "image/vnd.djvu", "djvu", "image/vnd.djvu", "dll",
			"application/octet-stream", "dmg", "application/octet-stream", "dms", "application/octet-stream", "dtd",
			"application/xml-dtd", "dv", "video/x-dv", "dxr", "application/x-director", "eps", "application/postscript",
			"exe", "application/octet-stream", "ez", "application/andrew-inset", "gram", "application/srgs", "grxml",
			"application/srgs+xml", "gz", "application/x-gzip", "htm", "text/html", "html", "text/html", "ico",
			"image/x-icon", "ics", "text/calendar", "ifb", "text/calendar", "iges", "model/iges", "igs", "model/iges",
			"jp2", "image/jp2", "jpe", "image/jpeg", "jpeg", "image/jpeg", "jpg", "image/jpeg", "kar", "audio/midi",
			"lha", "application/octet-stream", "lzh", "application/octet-stream", "m4a", "audio/mp4a-latm", "m4p",
			"audio/mp4a-latm", "m4u", "video/vnd.mpegurl", "m4v", "video/x-m4v", "mac", "image/x-macpaint", "mathml",
			"application/mathml+xml", "mesh", "model/mesh", "mid", "audio/midi", "midi", "audio/midi", "mov",
			"video/quicktime", "mp2", "audio/mpeg", "mp3", "audio/mpeg", "mp4", "video/mp4", "mpe", "video/mpeg",
			"mpeg", "video/mpeg", "mpg", "video/mpeg", "mpga", "audio/mpeg", "msh", "model/mesh", "nc",
			"application/x-netcdf", "oda", "application/oda", "ogv", "video/ogv", "pct", "image/pict", "pic",
			"image/pict", "pict", "image/pict", "pnt", "image/x-macpaint", "pntg", "image/x-macpaint", "ps",
			"application/postscript", "qt", "video/quicktime", "qti", "image/x-quicktime", "qtif", "image/x-quicktime",
			"ram", "audio/x-pn-realaudio", "rdf", "application/rdf+xml", "rm", "application/vnd.rn-realmedia", "roff",
			"application/x-troff", "sgm", "text/sgml", "sgml", "text/sgml", "silo", "model/mesh", "skd",
			"application/x-koan", "skm", "application/x-koan", "skp", "application/x-koan", "skt", "application/x-koan",
			"smi", "application/smil", "smil", "application/smil", "snd", "audio/basic", "so",
			"application/octet-stream", "svg", "image/svg+xml", "t", "application/x-troff", "texi",
			"application/x-texinfo", "texinfo", "application/x-texinfo", "tif", "image/tiff", "tiff", "image/tiff",
			"tr", "application/x-troff", "txt", "text/plain", "vrml", "model/vrml", "vxml", "application/voicexml+xml",
			"webm", "video/webm", "webp", "image/webp", "wrl", "model/vrml", "xht", "application/xhtml+xml", "xhtml",
			"application/xhtml+xml", "xml", "application/xml", "xsl", "application/xml", "xslt", "application/xslt+xml",
			"xul", "application/vnd.mozilla.xul+xml");
}
